Merge pull request #905 from ianblenke/ianblenke/issue887

Adding a working example of docker linked mysql container for issue #887

Ian Blenke 9 years ago
parent
commit
95d2cdb8f3
5 changed files with 100 additions and 20 deletions
  1. 7 3
      docker/Dockerfile
  2. 20 9
      docker/README.md
  3. 28 0
      docker/docker-compose.yml
  4. 35 8
      docker/scripts/init
  5. 10 0
      lib/tasks/database_test.rake

+ 7 - 3
docker/Dockerfile

@@ -19,11 +19,15 @@ RUN apt-get update && \
19 19
 
20 20
 RUN pip install supervisor-stdout
21 21
 
22
-ADD scripts/ /scripts
23
-RUN chmod 755 /scripts/setup /scripts/init
24
-
22
+ADD scripts/setup /scripts/setup
23
+RUN chmod 755 /scripts/setup
25 24
 RUN /scripts/setup
26 25
 
26
+WORKDIR /app
27
+
28
+ADD scripts/init /scripts/init
29
+RUN chmod 755 /scripts/init
30
+
27 31
 VOLUME /var/lib/mysql
28 32
 
29 33
 EXPOSE 3000

+ 20 - 9
docker/README.md

@@ -51,21 +51,32 @@ Simple stand-alone usage:
51 51
 
52 52
 To link to another mysql container, for example:
53 53
 
54
-    docker run --rm --name newcentury_mysql -p 3306 \
55
-        -e HUGINN_MYSQL_DATABASE=huginn \
56
-        -e HUGINN_MYSQL_USER=huginn \
57
-        -e HUGINN_MYSQL_PASSWORD=somethingsecret \
58
-        -e HUGINN_MYSQL_ROOT_PASSWORD=somethingevenmoresecret \
59
-        cantino/huginn
60
-    docker run --rm --name huginn --link newcentury_mysql:MYSQL -p 3000:3000 \
54
+    docker run --rm --name huginn_mysql \
55
+        -e MYSQL_DATABASE=huginn \
56
+        -e MYSQL_USER=huginn \
57
+        -e MYSQL_PASSWORD=somethingsecret \
58
+        -e MYSQL_ROOT_PASSWORD=somethingevenmoresecret \
59
+        mysql
60
+    docker run --rm --name huginn \
61
+        --link huginn_mysql:mysql \
62
+        -p 3000:3000 \
61 63
         -e HUGINN_DATABASE_NAME=huginn \
62
-        -e HUGINN_DATABASE_USER=huginn \
64
+        -e HUGINN_DATABASE_USERNAME=huginn \
63 65
         -e HUGINN_DATABASE_PASSWORD=somethingsecret \
64 66
         cantino/huginn
65 67
 
66 68
 To link to another container named 'postgres':
67 69
 
68
-    docker run --rm --name huginn --link POSTGRES:mysql -p 3000:3000 -e "DATABASE_USER=huginn" -e "DATABASE_PASSWORD=pass@word" cantino/huginn
70
+    docker run --rm --name huginn \
71
+        --link huginn_postgres:postgres \
72
+        -p 3000:3000 \
73
+        -e "HUGINN_DATABASE_USERNAME=huginn" \
74
+        -e "HUGINN_DATABASE_PASSWORD=pass@word" \
75
+        cantino/huginn
76
+
77
+The `docker/` folder also has a `docker-compose.yml` that allows for a sample database formation with a data volume container:
78
+
79
+    cd docker ; docker-compose up
69 80
 
70 81
 ## Environment Variables
71 82
 

+ 28 - 0
docker/docker-compose.yml

@@ -0,0 +1,28 @@
1
+mysqldata:
2
+  image: mysql
3
+  command: /bin/true
4
+
5
+mysql:
6
+  image: mysql
7
+  volumes_from:
8
+    - mysqldata
9
+  environment:
10
+    MYSQL_ROOT_PASSWORD: myrootpassword
11
+    MYSQL_DATABASE: huginn
12
+    MYSQL_USER: huginn
13
+    MYSQL_PASSWORD: myhuginnpassword
14
+
15
+huginn:
16
+  build: .
17
+  ports:
18
+    - 3000:3000
19
+  environment:
20
+    HUGINN_DATABASE_NAME: huginn
21
+    HUGINN_DATABASE_USERNAME: root
22
+    HUGINN_DATABASE_PASSWORD: myrootpassword
23
+    INTENTIONALLY_SLEEP: 10
24
+    #DATABASE_INITIAL_CONNECT_MAX_RETRIES: 5
25
+    PORT: 3000
26
+  links:
27
+    - mysql
28
+

+ 35 - 8
docker/scripts/init

@@ -105,7 +105,7 @@ EOF
105 105
 
106 106
   # wait for mysql server to start (max 120 seconds)
107 107
   timeout=120
108
-  while ! mysqladmin -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} status >/dev/null 2>&1
108
+  while ! mysqladmin -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} status >/dev/null 2>&1
109 109
   do
110 110
     (( timeout = timeout - 1 ))
111 111
     if [ \$timeout -eq 0 ]; then
@@ -116,10 +116,10 @@ EOF
116 116
     sleep 1
117 117
   done
118 118
 
119
-  if ! echo "USE \${DATABASE_NAME}" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} >/dev/null 2>&1; then
119
+  if ! echo "USE \${DATABASE_NAME}" | mysql -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} >/dev/null 2>&1; then
120 120
     DB_INIT="yes"
121 121
     echo "CREATE DATABASE IF NOT EXISTS \\\`\${DATABASE_NAME}\\\` DEFAULT CHARACTER SET \\\`utf8\\\` COLLATE \\\`utf8_unicode_ci\\\`;" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD}
122
-    echo "GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON \\\`${DATABASE_NAME}\\\`.* TO 'root'@'localhost';" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD}
122
+    echo "GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON \\\`${DATABASE_NAME}\\\`.* TO 'root'@'localhost';" | mysql -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD}
123 123
   fi
124 124
 fi
125 125
 supervisorctl start foreman >/dev/null
@@ -147,19 +147,46 @@ cat <<FOREMAN > /tmp/foreman.sh
147 147
 #!/bin/bash -e
148 148
 source /app/.env
149 149
 
150
+# The database may need to start up for a bit first
151
+if [ -n "\${INTENTIONALLY_SLEEP}" ]; then
152
+  echo "Intentionally sleeping \${INTENTIONALLY_SLEEP}"
153
+  sleep \${INTENTIONALLY_SLEEP}
154
+fi
155
+
156
+if [ -n "\${DATABASE_INITIAL_CONNECT_MAX_RETRIES}" ]; then
157
+  max=\${DATABASE_INITIAL_CONNECT_MAX_RETRIES}
158
+  count=0
159
+  while ! rake database_test:ping > /dev/null 2>&1 && [[ \$count -le \$max ]] ; do
160
+    count=\$[\$count+1]
161
+    echo "Retry \$count of \$max attempting to connect to \$DATABASE_HOST. Sleeping \${DATABASE_INITIAL_CONNECT_SLEEP:5}"
162
+    sleep \${DATABASE_INITIAL_CONNECT_SLEEP:5}
163
+  done
164
+fi
165
+
166
+# We may need to try and create a database
167
+if [ -n "\${CREATE_DB}" ]; then
168
+ sudo -u huginn -EH bundle exec rake db:create
169
+fi
170
+
150 171
 # Assuming we have a created database, run the migrations and seed it idempotently.
151
-[ -z "\${DO_NOT_MIGRATE}" ] && sudo -u huginn -EH bundle exec rake db:migrate
152
-[ -z "\${DO_NOT_SEED}" ] && sudo -u huginn -EH bundle exec rake db:seed
172
+if [ -z "\${DO_NOT_MIGRATE}" ]; then
173
+ sudo -u huginn -EH bundle exec rake db:migrate
174
+fi
153 175
 
154
-[ -n "\$INTENTIONALLY_SLEEP" ] && sleep \$INTENTIONALLY_SLEEP
176
+if [ -z "\${DO_NOT_SEED}" ]; then
177
+  sudo -u huginn -EH bash -xc 'bundle exec rake db:seed &'
178
+fi
155 179
 
156 180
 # Fixup the Procfile and prepare the PORT
157
-[ -n "\${DO_NOT_RUN_JOBS}" ] && perl -pi -e 's/^jobs:/#jobs:/' /app/Procfile
181
+if [ -n "\${DO_NOT_RUN_JOBS}" ]; then
182
+  perl -pi -e 's/^jobs:/#jobs:/' /app/Procfile
183
+fi
184
+
158 185
 perl -pi -e 's/rails server -b0.0.0.0\$/rails server -b 0.0.0.0 -p \\\$PORT/' /app/Procfile
159 186
 export PORT="\${PORT:-3000}"
160 187
 
161 188
 # Start huginn
162
-exec sudo -u huginn -EH bundle exec foreman start
189
+exec sudo -u huginn -EH bash -xc 'exec bundle exec foreman start'
163 190
 FOREMAN
164 191
 
165 192
 chmod 755 /tmp/foreman.sh

+ 10 - 0
lib/tasks/database_test.rake

@@ -0,0 +1,10 @@
1
+namespace :database_test do
2
+  desc "Ping the database"
3
+  task :ping do
4
+    require 'active_record'
5
+    require 'mysql2'
6
+    require 'pg'
7
+    ActiveRecord::Base.establish_connection
8
+    ActiveRecord::Base.connection.verify!
9
+  end
10
+end